package com.ruoyi.system.controller;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysSsoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * Nginx 外部鉴权控制器 (最终版)
 * <p>
 * 完全基于若依标准组件，提供给 Nginx 的 auth_request 指令进行调用。
 *
 * @author YourName
 */
@RestController
@RequestMapping("/api/auth") // 定义基础路径
public class AuthController {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private ISysSsoService ssoService;


    /**
     * Nginx auth_request 调用的鉴权端点。
     * <p>
     * 验证名为 "DIFY_SESSION_ID" 的 Cookie 中携带的 Token 是否有效。
     *
     * @param token 从 Cookie 中自动注入的 token 值。
     * @return 如果授权成功，返回 200 OK；如果失败，返回 401 Unauthorized。
     */
    @RequestMapping("/check") // 最终提供给 Nginx 的完整路径是 /api/auth/check
    public ResponseEntity<Void> checkAuth(
            @CookieValue(name = "DIFY_SESSION_ID", required = false) String token) {

        if (token == null) {
            // 如果 Cookie 不存在，直接判定为未授权
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }

        // 使用我们刚刚在 TokenService 中添加的、可靠的新方法来验证 token
        LoginUser loginUser = tokenService.getLoginUserByToken(token);

        if (loginUser != null) {
            // 验证通过，找到了有效的登录用户
            // 【推荐】调用 verifyToken 刷新令牌在 Redis 中的有效期，实现会话自动续期
            tokenService.verifyToken(loginUser);

            // Session 有效，授权通过！返回 HTTP 200 OK
            return ResponseEntity.ok().build();
        } else {
            // Token 无效、已过期或在 Redis 中不存在，授权失败！
            // 返回 HTTP 401 Unauthorized
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }
    @Value("${token.cookie.domain}")
    private String cookieDomain;
    /**
     * 第三方平台单点登录入口
     * 前端接收到 ticket 后调用此接口
     *
     * @param ticket   第三方平台提供的票据
     * @param platform 平台标识 (可选, 此处未使用)
     * @return 包含本系统token的成功响应或错误信息
     */
    @GetMapping("/login")
    public AjaxResult thirdPartyLogin(@RequestParam String ticket, @RequestParam(required = false) String platform, HttpServletRequest request, HttpServletResponse response) {
        // 1. 校验 ticket 是否为空
        if (StringUtils.isEmpty(ticket)) {
            return AjaxResult.error("Ticket不能为空");
        }

        try {
            // 2. 调用 Service 层处理登录逻辑
            String token = ssoService.processSsoLogin(ticket);

            // 3. 构造返回结果，将 token 放入 data 中
            Map<String, Object> result = new HashMap<>();
            result.put("token", token);
            // 这里可以根据需要返回更多用户信息
            // --- SSO Cookie 设置 ---
            final String COOKIE_NAME = "DIFY_SESSION_ID";
            Cookie sessionCookie = new Cookie(COOKIE_NAME, token);

            // --- 核心属性设置 ---
            sessionCookie.setHttpOnly(true);
            sessionCookie.setPath("/");
            sessionCookie.setMaxAge(10080 * 60);

            // 在生产环境的HTTPS中，务必开启
            sessionCookie.setSecure(true);
            sessionCookie.setDomain(cookieDomain);
            // 将 Cookie 添加到响应头
            response.addCookie(sessionCookie);
            return AjaxResult.success(result);
        } catch (Exception e) {
            // 4. 捕获 Service 层可能抛出的所有异常，并返回统一的错误信息
            return AjaxResult.error("单点登录失败: " + e.getMessage());
        }
    }
}